package com.hubspot.jinjava.lib.filter;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import org.apache.commons.lang3.BooleanUtils;
import org.apache.commons.lang3.StringEscapeUtils;
import org.apache.commons.lang3.StringUtils;
import com.hubspot.jinjava.doc.annotations.JinjavaDoc;
import com.hubspot.jinjava.doc.annotations.JinjavaParam;
import com.hubspot.jinjava.doc.annotations.JinjavaSnippet;
import com.hubspot.jinjava.interpret.JinjavaInterpreter;
@JinjavaDoc(
value = "Create an HTML/XML attribute string based on the items in a dict.",
params = {
@JinjavaParam(value = "d", type = "dict", desc = "Dict to filter"),
@JinjavaParam(value = "autospace", type = "boolean", defaultValue = "True", desc = "Automatically prepend a space in front of the item")
},
snippets = {
@JinjavaSnippet(
code = "{% set html_attributes = {'class': 'bold', 'id': 'sidebar'} %}\n" +
"<div {{ html_attributes|xmlattr }}></div>")
})
public class XmlAttrFilter implements Filter {
@Override
public String getName() {
return "xmlattr";
}
@Override
public Object filter(Object var, JinjavaInterpreter interpreter, String... args) {
if (var == null || !Map.class.isAssignableFrom(var.getClass())) {
return var;
}
@SuppressWarnings("unchecked")
Map<String, Object> dict = (Map<String, Object>) var;
List<String> attrs = new ArrayList<>();
for (Map.Entry<String, Object> entry : dict.entrySet()) {
attrs.add(new StringBuilder(entry.getKey())
.append("=\"")
.append(StringEscapeUtils.escapeXml10(Objects.toString(entry.getValue(), "")))
.append("\"")
.toString());
}
String space = " ";
if (args.length > 0 && !BooleanUtils.toBoolean(args[0])) {
space = "";
}
return space + StringUtils.join(attrs, "\n");
}
}